1 module directx.d3d11shadertracing;
2 
3 version(Windows):
4 version(Direct3D_11):
5 
6 import directx.d3d11shader;
7 
8 extern(C) {
9 
10 enum D3D11_SHADER_TYPE
11 {
12 	D3D11_VERTEX_SHADER	= 1,
13 	D3D11_HULL_SHADER	= 2,
14 	D3D11_DOMAIN_SHADER	= 3,
15 	D3D11_GEOMETRY_SHADER	= 4,
16 	D3D11_PIXEL_SHADER	= 5,
17 	D3D11_COMPUTE_SHADER	= 6
18 }
19 
20 enum D3D11_TRACE_COMPONENT_X = 0x1;
21 enum D3D11_TRACE_COMPONENT_Y = 0x2;
22 enum D3D11_TRACE_COMPONENT_Z = 0x4;
23 enum D3D11_TRACE_COMPONENT_W = 0x8;
24 alias D3D11_TRACE_COMPONENT_MASK = UINT8;
25 
26 struct D3D11_VERTEX_SHADER_TRACE_DESC
27 {
28 	UINT64 Invocation;
29 }
30 
31 struct D3D11_HULL_SHADER_TRACE_DESC
32 {
33 	UINT64 Invocation;
34 }
35 
36 struct D3D11_DOMAIN_SHADER_TRACE_DESC
37 {
38     UINT64 Invocation;
39 }
40 
41 struct D3D11_GEOMETRY_SHADER_TRACE_DESC
42 {
43 	UINT64 Invocation;
44 }
45 
46 struct D3D11_PIXEL_SHADER_TRACE_DESC
47 {
48     UINT64 Invocation;
49     INT X;
50     INT Y;
51     UINT64 SampleMask;
52 }
53 
54 struct D3D11_COMPUTE_SHADER_TRACE_DESC
55 {
56 	UINT64 Invocation;
57 	UINT[3] ThreadIDInGroup;
58 	UINT[3] ThreadGroupID;
59 }
60 
61 enum D3D11_SHADER_TRACE_FLAG_RECORD_REGISTER_WRITES  = 0x1;
62 enum D3D11_SHADER_TRACE_FLAG_RECORD_REGISTER_READS   = 0x2;
63 
64 struct D3D11_SHADER_TRACE_DESC
65 {
66 	D3D11_SHADER_TYPE Type;
67 	UINT Flags;
68 	union 
69 	{
70 		D3D11_VERTEX_SHADER_TRACE_DESC VertexShaderTraceDesc;
71 		D3D11_HULL_SHADER_TRACE_DESC HullShaderTraceDesc;
72 		D3D11_DOMAIN_SHADER_TRACE_DESC DomainShaderTraceDesc;
73 		D3D11_GEOMETRY_SHADER_TRACE_DESC GeometryShaderTraceDesc;
74 		D3D11_PIXEL_SHADER_TRACE_DESC PixelShaderTraceDesc;
75 		D3D11_COMPUTE_SHADER_TRACE_DESC ComputeShaderTraceDesc;
76 	}
77 }
78 
79 alias DWORD D3D11_TRACE_GS_INPUT_PRIMITIVE;
80 enum : D3D11_TRACE_GS_INPUT_PRIMITIVE
81 {
82 	D3D11_TRACE_GS_INPUT_PRIMITIVE_UNDEFINED	= 0,
83 	D3D11_TRACE_GS_INPUT_PRIMITIVE_POINT	= 1,
84 	D3D11_TRACE_GS_INPUT_PRIMITIVE_LINE	= 2,
85 	D3D11_TRACE_GS_INPUT_PRIMITIVE_TRIANGLE	= 3,
86 	D3D11_TRACE_GS_INPUT_PRIMITIVE_LINE_ADJ	= 6,
87 	D3D11_TRACE_GS_INPUT_PRIMITIVE_TRIANGLE_ADJ	= 7
88 }
89 
90 struct D3D11_TRACE_STATS
91 {
92 	D3D11_SHADER_TRACE_DESC TraceDesc;
93 	UINT8 NumInvocationsInStamp;
94 	UINT8 TargetStampIndex;
95 	UINT NumTraceSteps;
96 	D3D11_TRACE_COMPONENT_MASK[32] InputMask;
97 	D3D11_TRACE_COMPONENT_MASK[32] OutputMask;
98 	UINT16 NumTemps;
99 	UINT16 MaxIndexableTempIndex;
100 	UINT16[4096] IndexableTempSize;
101 	UINT16 ImmediateConstantBufferSize;
102 	UINT[4][2] PixelPosition;
103 	UINT64[4] PixelCoverageMask;
104 	UINT64[4] PixelDiscardedMask;
105 	UINT64[4] PixelCoverageMaskAfterShader;
106 	UINT64[4] PixelCoverageMaskAfterA2CSampleMask;
107 	UINT64[4] PixelCoverageMaskAfterA2CSampleMaskDepth;
108 	UINT64[4] PixelCoverageMaskAfterA2CSampleMaskDepthStencil;
109 	BOOL PSOutputsDepth;
110 	BOOL PSOutputsMask;
111 	D3D11_TRACE_GS_INPUT_PRIMITIVE GSInputPrimitive;
112 	BOOL GSInputsPrimitiveID;
113 	D3D11_TRACE_COMPONENT_MASK[32] HSOutputPatchConstantMask;
114 	D3D11_TRACE_COMPONENT_MASK[32] DSInputPatchConstantMask;
115 }
116 
117 struct D3D11_TRACE_VALUE
118 {
119 	UINT[4] Bits;
120 	D3D11_TRACE_COMPONENT_MASK ValidMask;
121 }
122 
123 alias DWORD D3D11_TRACE_REGISTER_TYPE;
124 enum : D3D11_TRACE_REGISTER_TYPE
125 {
126 	D3D11_TRACE_OUTPUT_NULL_REGISTER	= 0,
127 	D3D11_TRACE_INPUT_REGISTER	= ( D3D11_TRACE_OUTPUT_NULL_REGISTER + 1 ) ,
128 	D3D11_TRACE_INPUT_PRIMITIVE_ID_REGISTER	= ( D3D11_TRACE_INPUT_REGISTER + 1 ) ,
129 	D3D11_TRACE_IMMEDIATE_CONSTANT_BUFFER	= ( D3D11_TRACE_INPUT_PRIMITIVE_ID_REGISTER + 1 ) ,
130 	D3D11_TRACE_TEMP_REGISTER	= ( D3D11_TRACE_IMMEDIATE_CONSTANT_BUFFER + 1 ) ,
131 	D3D11_TRACE_INDEXABLE_TEMP_REGISTER	= ( D3D11_TRACE_TEMP_REGISTER + 1 ) ,
132 	D3D11_TRACE_OUTPUT_REGISTER	= ( D3D11_TRACE_INDEXABLE_TEMP_REGISTER + 1 ) ,
133 	D3D11_TRACE_OUTPUT_DEPTH_REGISTER	= ( D3D11_TRACE_OUTPUT_REGISTER + 1 ) ,
134 	D3D11_TRACE_CONSTANT_BUFFER	= ( D3D11_TRACE_OUTPUT_DEPTH_REGISTER + 1 ) ,
135 	D3D11_TRACE_IMMEDIATE32	= ( D3D11_TRACE_CONSTANT_BUFFER + 1 ) ,
136 	D3D11_TRACE_SAMPLER	= ( D3D11_TRACE_IMMEDIATE32 + 1 ) ,
137 	D3D11_TRACE_RESOURCE	= ( D3D11_TRACE_SAMPLER + 1 ) ,
138 	D3D11_TRACE_RASTERIZER	= ( D3D11_TRACE_RESOURCE + 1 ) ,
139 	D3D11_TRACE_OUTPUT_COVERAGE_MASK	= ( D3D11_TRACE_RASTERIZER + 1 ) ,
140 	D3D11_TRACE_STREAM	= ( D3D11_TRACE_OUTPUT_COVERAGE_MASK + 1 ) ,
141 	D3D11_TRACE_THIS_POINTER	= ( D3D11_TRACE_STREAM + 1 ) ,
142 	D3D11_TRACE_OUTPUT_CONTROL_POINT_ID_REGISTER	= ( D3D11_TRACE_THIS_POINTER + 1 ) ,
143 	D3D11_TRACE_INPUT_FORK_INSTANCE_ID_REGISTER	= ( D3D11_TRACE_OUTPUT_CONTROL_POINT_ID_REGISTER + 1 ) ,
144 	D3D11_TRACE_INPUT_JOIN_INSTANCE_ID_REGISTER	= ( D3D11_TRACE_INPUT_FORK_INSTANCE_ID_REGISTER + 1 ) ,
145 	D3D11_TRACE_INPUT_CONTROL_POINT_REGISTER	= ( D3D11_TRACE_INPUT_JOIN_INSTANCE_ID_REGISTER + 1 ) ,
146 	D3D11_TRACE_OUTPUT_CONTROL_POINT_REGISTER	= ( D3D11_TRACE_INPUT_CONTROL_POINT_REGISTER + 1 ) ,
147 	D3D11_TRACE_INPUT_PATCH_CONSTANT_REGISTER	= ( D3D11_TRACE_OUTPUT_CONTROL_POINT_REGISTER + 1 ) ,
148 	D3D11_TRACE_INPUT_DOMAIN_POINT_REGISTER	= ( D3D11_TRACE_INPUT_PATCH_CONSTANT_REGISTER + 1 ) ,
149 	D3D11_TRACE_UNORDERED_ACCESS_VIEW	= ( D3D11_TRACE_INPUT_DOMAIN_POINT_REGISTER + 1 ) ,
150 	D3D11_TRACE_THREAD_GROUP_SHARED_MEMORY	= ( D3D11_TRACE_UNORDERED_ACCESS_VIEW + 1 ) ,
151 	D3D11_TRACE_INPUT_THREAD_ID_REGISTER	= ( D3D11_TRACE_THREAD_GROUP_SHARED_MEMORY + 1 ) ,
152 	D3D11_TRACE_INPUT_THREAD_GROUP_ID_REGISTER	= ( D3D11_TRACE_INPUT_THREAD_ID_REGISTER + 1 ) ,
153 	D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_REGISTER	= ( D3D11_TRACE_INPUT_THREAD_GROUP_ID_REGISTER + 1 ) ,
154 	D3D11_TRACE_INPUT_COVERAGE_MASK_REGISTER	= ( D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_REGISTER + 1 ) ,
155 	D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_FLATTENED_REGISTER	= ( D3D11_TRACE_INPUT_COVERAGE_MASK_REGISTER + 1 ) ,
156 	D3D11_TRACE_INPUT_GS_INSTANCE_ID_REGISTER	= ( D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_FLATTENED_REGISTER + 1 ) ,
157 	D3D11_TRACE_OUTPUT_DEPTH_GREATER_EQUAL_REGISTER	= ( D3D11_TRACE_INPUT_GS_INSTANCE_ID_REGISTER + 1 ) ,
158 	D3D11_TRACE_OUTPUT_DEPTH_LESS_EQUAL_REGISTER	= ( D3D11_TRACE_OUTPUT_DEPTH_GREATER_EQUAL_REGISTER + 1 ) ,
159 	D3D11_TRACE_IMMEDIATE64	= ( D3D11_TRACE_OUTPUT_DEPTH_LESS_EQUAL_REGISTER + 1 ) ,
160 	D3D11_TRACE_INPUT_CYCLE_COUNTER_REGISTER	= ( D3D11_TRACE_IMMEDIATE64 + 1 ) ,
161 	D3D11_TRACE_INTERFACE_POINTER	= ( D3D11_TRACE_INPUT_CYCLE_COUNTER_REGISTER + 1 ) 
162 }
163 
164 enum D3D11_TRACE_REGISTER_FLAGS_RELATIVE_INDEXING = 0x1;
165 struct D3D11_TRACE_REGISTER
166 {
167 	D3D11_TRACE_REGISTER_TYPE RegType;
168 	union 
169 	{
170 		UINT16 Index1D;
171 		UINT16[2] Index2D;
172 	}
173 	UINT8 OperandIndex;
174 	UINT8 Flags;
175 }
176 
177 enum D3D11_TRACE_MISC_GS_EMIT = 0x1;
178 enum D3D11_TRACE_MISC_GS_CUT  = 0x2;
179 enum D3D11_TRACE_MISC_PS_DISCARD = 0x4;
180 enum D3D11_TRACE_MISC_GS_EMIT_STREAM = 0x8;
181 enum D3D11_TRACE_MISC_GS_CUT_STREAM = 0x10;
182 enum D3D11_TRACE_MISC_HALT = 0x20;
183 enum D3D11_TRACE_MISC_MESSAGE = 0x40;
184 alias D3D11_TRACE_MISC_OPERATIONS_MASK = UINT16;
185 
186 struct D3D11_TRACE_STEP
187 {
188 	UINT ID;
189 	BOOL InstructionActive;
190 	UINT8 NumRegistersWritten;
191 	UINT8 NumRegistersRead;
192 	D3D11_TRACE_MISC_OPERATIONS_MASK MiscOperations;
193 	UINT OpcodeType;
194 	UINT64 CurrentGlobalCycle;
195 }
196 
197 mixin( uuid!(ID3D11ShaderTrace, "36b013e6-2811-4845-baa7-d623fe0df104") );
198 interface ID3D11ShaderTrace : IUnknown
199 {
200 	extern(Windows):
201     public:
202         HRESULT  TraceReady(
203             /*out*/ UINT64* pTestCount);
204         
205         void ResetTrace();
206         
207         HRESULT GetTraceStats( 
208             /*out*/ D3D11_TRACE_STATS* pTraceStats);
209         
210         HRESULT PSSelectStamp( 
211             UINT stampIndex);
212         
213         HRESULT GetInitialRegisterContents( 
214             D3D11_TRACE_REGISTER *pRegister,
215             /*out*/ D3D11_TRACE_VALUE* pValue) ;
216         
217         HRESULT GetStep( 
218             UINT stepIndex,
219             /*out*/ D3D11_TRACE_STEP* pTraceStep);
220         
221         HRESULT GetWrittenRegister( 
222             UINT stepIndex,
223             UINT writtenRegisterIndex,
224             /*out*/ D3D11_TRACE_REGISTER* pRegister,
225             /*out*/ D3D11_TRACE_VALUE* pValue);
226         
227         HRESULT GetReadRegister( 
228             UINT stepIndex,
229             UINT readRegisterIndex,
230             /*out*/ D3D11_TRACE_REGISTER* pRegister,
231             /*out*/ D3D11_TRACE_VALUE* pValue);
232 }
233 
234 mixin( uuid!(ID3D11ShaderTraceFactory, "1fbad429-66ab-41cc-9617-667ac10e4459") );
235 interface ID3D11ShaderTraceFactory : IUnknown
236 {
237 	extern(Windows):
238         HRESULT CreateShaderTrace( 
239             IUnknown pShader,
240             D3D11_SHADER_TRACE_DESC* pTraceDesc,
241             /*out*/ ID3D11ShaderTrace* ppShaderTrace);
242 
243 }
244 
245 
246 extern(Windows):
247 HRESULT D3DDisassemble11Trace( LPCVOID pSrcData,
248                       SIZE_T SrcDataSize,
249                       ID3D11ShaderTrace pTrace,
250                       UINT StartStep,
251                       UINT NumSteps,
252                       UINT Flags,
253                       /*out*/ID3D10Blob* ppDisassembly);
254 }